In complex systems, particularly in relatively complex data storage and retrieval systems, it might occur that conditions of individual components of the system should be noticed, and action taken thereon. For just one example, in a RAID storage system it might occur that one of the disk drives becomes unavailable or unreliable. In such cases, the system might respond by alerting an operator to that condition, and upon re-availability or the presence of a newly available and reliable disk drive, the system might take remedial measures, such as for example re-striping and recomputing parity for a set of striped data blocks formerly maintained, in whole or in part, on the disk drive that was repaired or replaced.
One problem in the known art is that when such systems are relatively complex, whether in design, in implementation, or in operation, action taken by one component of the system might have an unexpected effect upon other components of the system. For just one example, in a storage system with multiple tiers, such as for example a system including paging memory blocks to storage on disk, it might occur that one element of the system might be attempting to read data from, or write data to, a disk drive, while another element of the system is attempting to determine if that disk drive is reliable or if its data should be moved to another location. Multiple such operations might be inconsistent if performed concurrently, or at least without provision for the possibility that such multiple operations might occur.
Known methods include operating system locking techniques. While these techniques generally achieve their purpose of preventing inconsistent operations from occurring concurrently, they have at least the drawback that they involve careful checks, either during design and operation, to assure that they are uniformly consistent and do not interfere.